package thinkingInJava.typeinfo.Proxy.InterfaceHidden;

//: typeinfo/ModifyingPrivateFields.java
import java.lang.reflect.*;

class WithPrivateFinalField {
private int i = 1;
private final String s = "I'm totally safe";
private String s2 = "Am I safe?";
public String toString() {
  return "i = " + i + ", " + s + ", " + s2;
}
}

public class ModifyingPrivateFields {
public static void main(String[] args) throws Exception {
  WithPrivateFinalField pf = new WithPrivateFinalField();
  System.out.println(pf);
  Field f = pf.getClass().getDeclaredField("i");
  f.setAccessible(true);
  System.out.println("f.getInt(pf): " + f.getInt(pf));
  f.setInt(pf, 47);
  System.out.println(pf);
  f = pf.getClass().getDeclaredField("s");
  f.setAccessible(true);
  System.out.println("f.get(pf): " + f.get(pf));
  f.set(pf, "No, you're not!");	// 修改 final 不成功，但也不报错
  System.out.println(pf);
  f = pf.getClass().getDeclaredField("s2");
  f.setAccessible(true);
  System.out.println("f.get(pf): " + f.get(pf));
  f.set(pf, "No, you're not!");
  System.out.println(pf);
}
} /* Output:
i = 1, I'm totally safe, Am I safe?
f.getInt(pf): 1
i = 47, I'm totally safe, Am I safe?
f.get(pf): I'm totally safe
i = 47, I'm totally safe, Am I safe?
f.get(pf): Am I safe?
i = 47, I'm totally safe, No, you're not!
*///:~

